using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using FiltronASP.Logger;

namespace FiltronASP.Models.DAO
{
    public class PageTypeAcceptableTemplateDAO : Abstracts.AbstractGenericDAO<PageTypeAcceptableTemplate, System.Nullable<int>>,
        Interfaces.IPageTypeAcceptableTemplateDAO
    {
        /// <summary>
        /// Metoda zwracajaca nazwe parametru bedacego kluczem glownym tabeli.
        /// </summary>
        /// <returns>nazwa klucza glownego</returns>
        protected override string GetKeyProperty()
        {
            return "page_type_template_id";
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie typu strony.
        /// </summary>
        /// <param name="pageTypeId">typ strony</param>
        /// <returns>Lista rekordów o zadanym typie strony</returns>
        public IQueryable<PageTypeAcceptableTemplate> FindByPage(int pageTypeId)
        {
            if (pageTypeId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                IQueryable<PageTypeAcceptableTemplate> pageTypesTemp = this._cmsEntitiesDataContext.PageTypeAcceptableTemplates.Where(
                    menu => menu.page_type_id.Equals(pageTypeId)
                        );
                if (!(pageTypesTemp.Any()))
                {
                    return null;
                }   //if
                return pageTypesTemp;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie typu strony i szablonu.
        /// </summary>
        /// <param name="pageTypeId">typ strony</param>
        /// <param name="templateId">szablon</param>
        /// <returns>Lista rekordów o zadanym typie strony i szablonie</returns>
        public IQueryable<PageTypeAcceptableTemplate> FindByPageAndTemplate(int pageTypeId, int templateId)
        {
            if (pageTypeId.Equals(0) || templateId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                IQueryable<PageTypeAcceptableTemplate> pageTypeTemplates = this._cmsEntitiesDataContext.PageTypeAcceptableTemplates.Where(
                    pety => pety.page_type_id.Equals(pageTypeId) && pety.template_id.Equals(templateId)
                        );
                if (!(pageTypeTemplates.Any()))
                {
                    return null;
                }   //if
                return pageTypeTemplates;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie typu strony, języka i ścieżki szablonu.
        /// </summary>
        /// <param name="pageTypeId">typ strony</param>
        /// <param name="languageId">język</param>
        /// <param name="templatePath">ścieżka szablonu</param>
        /// <returns>Lista rekordów o zadanym typie strony, języku i szablonie</returns>
        public IQueryable<PageTypeAcceptableTemplate> FindByPageAndLanguageAndTemplate(int languageId, int pageTypeId, string templatePath)
        {
            if (pageTypeId.Equals(0) || languageId.Equals(0) || String.IsNullOrEmpty(templatePath))
            {
                return null;
            }   //if
            try
            {
                IQueryable<PageTypeAcceptableTemplate> pageTypeTemplates = this._cmsEntitiesDataContext.PageTypeAcceptableTemplates.Where(
                    pety => pety.page_type_id.Equals(pageTypeId) && (this._cmsEntitiesDataContext.Templates.Where(
                        temp => temp.language_id.Equals(languageId) && temp.template_path.Equals(templatePath)
                        ).Select(te => te.template_id).Equals(pety.template_id)
                        )
                        );
                if (!(pageTypeTemplates.Any()))
                {
                    return null;
                }   //if
                return pageTypeTemplates;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Pobieranie listy obiektów na podstawie języka.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <returns>Lista rekordów o zadanym języku</returns>
        public IQueryable<PageTypeAcceptableTemplate> FindByLanguage(int languageId)
        {
            if (languageId.Equals(0))
            {
                return null;
            }   //if
            try
            {
                   IQueryable<PageTypeAcceptableTemplate> pageTypeTemplates = this._cmsEntitiesDataContext.PageTypeAcceptableTemplates.Where(
                       pety => pety.template_id.HasValue && (this._cmsEntitiesDataContext.Templates.Where(
                           temp => temp.language_id.HasValue && temp.language_id.Value.Equals(languageId)
                           ).Select(te => te.template_id).Contains(pety.template_id.Value)
                           )
                           );
                   /* IQueryable<PageTypeAcceptableTemplate> pageTypeTemplates = this._cmsEntitiesDataContext.PageTypeAcceptableTemplates.Where(
                        pety => pety.page_type_id.Equals(13));*/
                if (!(pageTypeTemplates.Any()))
                {
                    return null;
                }   //if
                return pageTypeTemplates;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return null;
        }

        /// <summary>
        /// Wstawianie listy obiektów na podstawie jezyka.
        /// </summary>
        /// <param name="defaultLanguageId">domyslny jezyk</param>
        /// <param name="newLanguageId">nowy jezyk</param>
        /// <returns>true jesli sie udalo, false wpp</returns>
        public bool InsertForNewLanguage(int defaultLanguageId, int newLanguageId)
        {
            if (defaultLanguageId.Equals(0) || newLanguageId.Equals(0))
            {
                return false;
            }   //if
            try
            {

                IQueryable<PageTypeAcceptableTemplate> pageTypeTemplates = this.FindByLanguage(defaultLanguageId);
                PageTypeDAO _pageTypeDAO = new PageTypeDAO();
                TemplateDAO _templateDAO = new TemplateDAO();
                if (pageTypeTemplates == null)
                {
                    return true;
                }   //if
                if (!(pageTypeTemplates.Any()))
                {
                    return true;
                }   //if
                foreach (PageTypeAcceptableTemplate pageTypeTemplate in pageTypeTemplates)
                {
                    PageTypeAcceptableTemplate pageTypeTemplateToInsert = new PageTypeAcceptableTemplate();
                    pageTypeTemplateToInsert.page_type_template_created = DateTime.Now;
                    pageTypeTemplateToInsert.page_type_template_modified = DateTime.Now;
                    PageType oldPageType = _pageTypeDAO.FindByPK(pageTypeTemplate.page_type_id);
                    if (oldPageType == null)
                    {
                        return false;
                    }
                    PageType newPageType = _pageTypeDAO.FindByNameAndLanguage(oldPageType.page_type_name, newLanguageId);
                    if (newPageType == null)
                    {
                        return false;
                    }
                    pageTypeTemplateToInsert.page_type_id = newPageType.page_type_id;
                    Template oldTemplate = _templateDAO.FindByPK(pageTypeTemplate.template_id);
                    if (oldTemplate == null)
                    {
                        return false;
                    }
                    Template newTemplate = _templateDAO.FindByLangAndName(newLanguageId, oldTemplate.template_name);
                    if (newTemplate == null)
                    {
                        return false;
                    }
                    pageTypeTemplateToInsert.template_id = newTemplate.template_id;
                    this.Add(pageTypeTemplateToInsert);
                }

            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return true;
        }


        /// <summary>
        /// Usuwanie obiektów na podstawie typu strony.
        /// </summary>
        /// <param name="pageTypeId">typ strony</param>
        /// <returns>true w przypadku usunięcia, false w przypadku nie odnalezienia rekordów</returns>
        public bool DeleteByPageType(int pageTypeId)
        {
            if (pageTypeId.Equals(0))
            {
                return false;
            }   //if
            try
            {
                IQueryable<PageTypeAcceptableTemplate> pageTypeTemplates = this._cmsEntitiesDataContext.PageTypeAcceptableTemplates.Where(
                    page => page.page_type_id.Equals(pageTypeId)
                        );
                if (!(pageTypeTemplates.Any()))
                {
                    return false;
                }
                foreach (PageTypeAcceptableTemplate i in pageTypeTemplates)
                {
                    this._cmsEntitiesDataContext.PageTypeAcceptableTemplates.DeleteOnSubmit(i);
                }
                try
                {
                    _cmsEntitiesDataContext.SubmitChanges();
                    return true;
                }
                catch (Exception ex)
                {
                    MyLogger.Log(ex);
                }   //catch
                //if

            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return false;
        }

        /// <summary>
        /// Usuwanie obiektow po jezyku.
        /// </summary>
        /// <param name="languageId">jezyk</param>
        /// <returns>true dla sukcesu, false w przeciwnym razie</returns>
        public bool DeleteByLanguage(int languageId)
        {
            if (languageId.Equals(0))
            {
                return false;
            }   //if
            try
            {
                IQueryable<PageTypeAcceptableTemplate> pates = this.FindByLanguage(languageId);
                if (pates == null)
                {
                    return true;
                }   //if
                if (!(pates.Any()))
                {
                    return true;
                }   //if
                foreach (PageTypeAcceptableTemplate pate in pates)
                {
                    this._cmsEntitiesDataContext.PageTypeAcceptableTemplates.DeleteOnSubmit(pate);
                }
                try
                {
                    _cmsEntitiesDataContext.SubmitChanges();

                }
                catch (Exception ex)
                {
                    MyLogger.Log(ex);
                }   //catch
                return true;
            }   //try
            catch (Exception ex)
            {
                MyLogger.Log(ex);
            }   //catch
            return false;
        }
    }
}
